package futbol.tacticas.concursantes2007.SeteTeam.jugadores.facklab;

import futbol.tacticas.concursantes2007.SeteTeam.jugadores.AbstractTacticaJugador;

import java.awt.Point;
import java.util.Vector;

import futbol.tacticas.Comando;


/**
 * Los centrales junto con uno de los delanteros se encargan de mover el 
 * balon en el ataque, tienen que ser los jugadores mas habiles del 
 * equipo.
 * 
 * @author Sete
 *
 */
public class TacticaCentroMedioBajo  extends AbstractTacticaJugador{
	
	public TacticaCentroMedioBajo(int xInicial, int yInicial, int fuerza, final Entrenador entrenador) {
		super(Entrenador.CEN_MED_BAJO, xInicial, yInicial, fuerza, entrenador);
	}
	
	protected Point EvaluacionLinealVertical(Point A, Point B, int D) {
		Point Solucion = B;
		Point Auxiliar;
		
		for (int i=-D;i<=D;i++){
			Auxiliar = new Point(B.x,i);
			if (Densidad_Jugadores(Solucion, A)>Densidad_Jugadores(Auxiliar, A)){
				Solucion = new Point(Auxiliar);;
			}
		}		
		return Solucion;
	}

	
	protected void generarMovimientoOfensivo(final Vector<Comando> comandos){
		
		Point P = new Point(getSituacion().getBola());

		if (P.x>50)  P = new Point(50,P.y);
		if (P.y<-80) P = new Point(P.x,-80);
		if (P.y>80)  P = new Point(P.x,80);
		comandos.add(irA(P.x,P.y));	
	}
	
	protected void generarMovimientoDefensivo(final Vector<Comando> comandos){
		final Point bola=getSituacion().getBola();
		int D = 50; // Desplazamiento
		int distanciaBalon = 60; // Distancia a la que se mantendra del balon
		
		Point P = new Point((int)bola.getX()+distanciaBalon,-D); // Punto central
		Point B = new Point(bola);
	
		Point O = EvaluacionLinealVertical(B,P,D);
		//if (O.getY()>0) O = new Point(O.x,0);
		comandos.add(irA(O.getX(), O.getY()));

	}
	
	protected void generarMovimientoUltraDefensivo(final Vector<Comando> comandos){
		final Point bola=getSituacion().getBola();
		int D = 60; // Desplazamiento
		int distanciaBalon = 50; // Distancia a la que se mantendra del balon
		
		Point P = new Point(getSituacion().getMisJugadores()[Entrenador.PORTERO].x+distanciaBalon,0); // Punto central
		Point B = new Point(bola);
	
		Point O = EvaluacionLinealVertical(B,P,D);
		//if (O.getY()>0) O = new Point(O.x,0);
		comandos.add(irA(O.getX(), O.getY()));

	}

	protected void generarMovimiento(final Vector<Comando> comandos) {
		if (getPosicion().distance(getSituacion().getBola())<40){
			Point O = new Point(getSituacion().getBola());
			comandos.add(irA(O.x, O.y));
		}else{
			if (getSituacion().getBola().getX()>0){
				generarMovimientoOfensivo(comandos);
			}else{
				if (getSituacion().getBola().getX()>-100){
					generarMovimientoDefensivo(comandos);
				}else{
					generarMovimientoUltraDefensivo(comandos);
				}
			}
		}
	}

	protected void generarAccionOfensiva(final Vector<Comando> comandos) {
		int Alto = Densidad_Jugadores(getPosicion(), getSituacion().getMisJugadores()[Entrenador.CEN_ALTO].getLocation()); 
		int Medio= Densidad_Jugadores(getPosicion(), getSituacion().getMisJugadores()[Entrenador.CEN_MED_ALTO].getLocation()); 
		int Bajo = Densidad_Jugadores(getPosicion(), getSituacion().getMisJugadores()[Entrenador.CEN_BAJO].getLocation()); 

		Comando temp = tiroAPuerta(0);
		if ((Alto  <= Medio) && (Alto <= Bajo)) temp = pase(Entrenador.CEN_ALTO);
		if ((Medio <= Alto ) && (Medio<= Bajo)) temp = pase(Entrenador.CEN_MED_ALTO);
		if ((Bajo  <= Medio) && (Bajo <= Alto)) temp = pase(Entrenador.CEN_BAJO);

		comandos.add(temp);
	}

	protected void generarAccionDefensiva(final Vector<Comando> comandos) {
		int Alto  = Densidad_Jugadores(getPosicion(), getSituacion().getMisJugadores()[Entrenador.CEN_ALTO]); 
		int Medio = Densidad_Jugadores(getPosicion(), getSituacion().getMisJugadores()[Entrenador.CEN_MED_ALTO]); 
		int Bajo  = Densidad_Jugadores(getPosicion(), getSituacion().getMisJugadores()[Entrenador.CEN_BAJO]); 
		int Centro= Densidad_Jugadores(getPosicion(), getSituacion().getMisJugadores()[Entrenador.DEL_BAJO]); 

		Comando temp = tiroAPuerta(0);
		if ((Alto  <= Medio) && (Alto <= Bajo) && (Alto <= Centro)) temp = pase(Entrenador.CEN_ALTO);
		if ((Medio <= Alto ) && (Medio<= Bajo) && (Medio<= Centro)) temp = pase(Entrenador.CEN_MED_ALTO);
		if ((Bajo  <= Medio) && (Bajo <= Alto) && (Bajo <= Centro)) temp = pase(Entrenador.CEN_BAJO);
		if ((Centro<= Medio) && (Centro<= Alto)&& (Centro <= Bajo)) temp = pase(Entrenador.DEL_BAJO);

		comandos.add(temp);
	}
	
	protected void generarAccion(final Vector<Comando> comandos) {
		if (getSituacion().getBola().getX()>0){
			generarAccionOfensiva(comandos);
		}else{
			generarAccionDefensiva(comandos);
		}
	}

}
